#include "..\headers\ListOf.h"
#define maxs 1e5

typedef int ElemType;

typedef struct LNodeList {
  ElemType data;
  struct LNodeList *next;
} LNodeList, *LinkList;

void freeList(LinkList head) {
  LinkList temp;
  while (head) {
    temp = head;
    head = head->next;
    free(temp);
  }
}

LinkList CreatList(int num) {
  LinkList Node = NULL, p = NULL, p1 = NULL;
  int f;
  if (num > maxs || num < 1)  // maxs == 1e5
    return NULL;
  while (num--) {
    scanf("%d", &f);
    p1 = (LinkList)malloc(sizeof(LNodeList) * 1);
    if (p1 == NULL) {
      freeList(Node);  // 释放已分配的内存
      return NULL;
    }
    p1->data = f;
    if (Node == NULL)
      Node = p1;
    else
      p->next = p1;
    p = p1;
  }
  p->next = NULL;
  return Node;
}

int main() {  // 创建链表
  int num, cnt = 0, maxn = 0;
  LinkList head = NULL, start1 = NULL, p = NULL,
           start2 = NULL;  // start1为循环起点，在cnt =
                           // 0时记录，start2为记录最大递增子序列起点
  scanf("%d", &num);
  head = CreatList(num);
  start1 = head, p = head;

  while (p != NULL) {
    cnt = 1;

    while ((p->next != NULL) &&
           (p->next->data >
            p->data)) {  // 比较p指针指向元素与下一元素的大小，若小于进入循环
                         // //代码可阅读性

      if (cnt == 1) start1 = p;  // 记录每次循环起点，以便于之后存入
      p = p->next;
      cnt++;
    }

    if (cnt >
        maxn) {  // 当cnt大于maxn时，覆盖原最大递增子序列起点，同时更新maxn值
      maxn = cnt;
      start2 = start1;
    }

    if (((p->next != NULL) && (p->next->data <= p->data)) ||
        (p->next ==
         NULL)) {  // 当下一元素大时，跳过，且在最后一位时应该进入循环
      p = p->next;
    }
  }

  for (int i = 0; i < maxn; i++) {  // 遍历子链表
    printf("%d", start2->data);

    if (i != maxn - 1) printf(" ");

    start2 = start2->next;
  }

  return 0;
}

// int main()
// {
//     int n,i;
//     scanf("%d",&n);
//     int a[n];
//     int t=0,start=0,cnt=0,maxl=1,beg = 0;
//     //beg是存放起始位置的下标，start为循环起点，在cnt = 0时记录
//     //cnt是表示当前子序列的长度，maxl是表示最长子序列的长度
//     for(i=0;i<n;i++)
//         scanf("%d",&a[i]);
//     while(t < n - 1)
//     {
//         cnt = 1;
//         while(a[t]<a[t+1]){
//             if(cnt == 1)start = t;
//             t++;
//             cnt++;
//         }
//         if(cnt > maxl){
//             maxl = cnt;
//             beg = start;
//         }
//         if(a[t] >= a[t+1])

//             t++;
//     }

//     for (int k = beg,j = 0;j < maxl;j++,k++)
//     {
//         printf("%d",a[k]);
//         if(j != maxl - 1) printf(" ");
//     }

// }

// #include <stdio.h>
// int main()
// {
//     int n,i;
//     scanf("%d",&n);
//     int a[n];
//     int t=0,beg=0,end=0,l=0,maxl=0;
//     //beg是存放起始位置的下标，end是存放结束位置的下标
//     //l是表示当前子序列的长度，maxl是表示最长子序列的长度
//     for(i=0;i<n;i++)
//         scanf("%d",&a[i]);
//     for(i=0;i<n;i++)
//     {
//         l++;//序列加一
//         //判断当前序列与最长序列长度的大小，并更新起始和终止位置
//         if(maxl<l)
//         {
//             maxl=l;
//             beg=t;
//             end=i;
//         }
//         if(a[i]>=a[i+1]){
//             l=0;
//             t=i+1;
//         }
//         //条件不满足，则当前序列变为0，并且记录下一个序列的起始位置
//     }
//     for(i=beg;i<end;i++)
//         printf("%d ",a[i]);
//     printf("%d",a[i]);
// }
